// 声明是main包，一个程序中只能有一个main包
package main

import "fmt"

// 主函数
func main() {
	// 1. hello,world
	//fmt.Println("Hello World!")

	// 2. 单个变量
	//var name string = "张三"
	//fmt.Println(name)

	/*
		3. 多个变量:
		类型的默认值：
			string：""
			int：0
			bool：false
	*/
	//var (
	//	name   string
	//	age    int
	//	gender bool
	//)
	//var (name, age, gender string)
	//
	//fmt.Println(name, age, gender)

	// 4. go的推导声明写法，自动推断变量类型
	//name := "lisi"
	//age := 22
	//fmt.Printf("%T, %T", name, age)	// 打印变量类型

	// 5. 变量地址值
	//var num int = 10
	//
	//fmt.Printf("变量值：%d, 变量地址值：%p", num, &num)	// %d为获取数字的值，%p为获取地址值

	// 6. 匿名变量，使用下划线接收变量值，相当于抛弃这个值。
	//a, _ := 5, 6
	//_, b := 5, 6
	//fmt.Println(a, b)

	// 7. 常量，const修饰
	//const URL string = "https://www.baidu.com\n"		// 显式声明
	//const URL2 = "https://www.baidu.com\n"			// 隐式声明
	//const URL3, URL4 = "URL3\n", "URL4\n"		// 多个相同类型简写
	//fmt.Println(URL, URL2, URL3, URL4)

	// 8. iota常量计数器
	//const (
	//	a = iota
	//	b
	//	c
	//)
	//
	//const (
	//	d = "hello"
	//	e
	//	f = iota
	//	g
	//)
	//fmt.Println(a, b, c, d, e, f, g)

	// 9、指针变量(&、*的使用)，& 表示取址，* 表示取值
	a := "AAA" // 声明一个字符串变量

	var b *string // 声明一个指针变量，指针变量的类型为 `*原类型`，如：*int、*string、*float
	b = &a        // b = a的地址值，即：0xc000040250
	fmt.Println(b)

	*b = "BBB"     // 修改 *b 的值，会导致 a 也发生改变
	fmt.Println(a) // 打印a的值：BBB，说明值被修改了

}
